import { TMap } from '../map'
import { LngLat } from '../entity/lngLat'
import { Polyline, PolylineOptions } from '../covering/polyline'

/**
 * 创建折线工具时的属性对象
 */
export interface PolylineToolOptions extends PolylineOptions {
    /**
     * 是否显示距离，如果不显示距离，则可以作为画线控件使用
     *
     * 默认值为 `false`
     */
    showLabel?: boolean
}

/**
 * 折线工具事件工厂对象
 */
type PolylineToolEventFactory = {
    /**
     * 用户双击完成一次折线绘制时触发事件
     *
     * ---
     *
     * - 特殊参数说明：
     *
     * `currentLnglats`：用户当前绘制的折线的点坐标数组。
     *
     * `currentDistance`：用户当前绘制的折线的地理长度。
     *
     * `currentPolyline`：当前测距所画折线对象。
     *
     * `allPolylines`：工具绘制的所有折线对象
     */
    draw: (event: { type: 'draw', target: PolylineTool, currentLnglats: Array<LngLat>, currentDistance: number, currentPolyline: Polyline, allPolylines: Array<Polyline> }) => void;

    /**
     * 用户在多边形绘制过程中，每次点击底图添加节点时触发事件
     *
     * ---
     *
     * - 特殊参数说明：
     *
     * `currentLnglats`：用户当前绘制的折线的点坐标数组。
     *
     * `currentDistance`：用户当前绘制的折线的地理长度。
     *
     * `currentPolyline`：当前测距所画折线对象。
     *
     * `allPolylines`：工具绘制的所有折线对象
     */
    addpoint: (event: { type: 'addpoint', target: PolylineTool, currentLnglats: Array<LngLat>, currentDistance: number, currentPolyline: Polyline, allPolylines: Array<Polyline> }) => void;
}

/**
 * 折线工具，可以通过事件来获取用户绘制的折线，包含测距功能
 */
export interface PolylineTool {
    /**
     * 创建一个折线工具
     *
     * @param map 地图对象
     *
     * @param opts 属性对象
     */
    new(map: TMap, opts?: PolylineToolOptions): PolylineTool;

    /**
     * 跟随鼠标移动的说明文字
     *
     * @param text 文字内容
     */
    setTips: (text: string) => void;

    /**
     * 计算一系列地理坐标点的距离总和
     *
     * @param lnglats 点坐标 `LngLat` 数组
     */
    getDistance: (lnglats: Array<LngLat>) => number;

    /**
     * 获取所有编辑完成的线
     */
    getPolylines: () => Array<Polyline>;

    /**
     * 完成一个折线的绘制，运行此方法相当于用户点击双击结束当前折线的绘制
     */
    endDraw: () => void;

    /**
     * 清空工具绘制所有线
     */
    clear: () => void;
    /**
     * 开启测距工具
     */
    open: () => boolean;
    /**
     * 关闭测距工具
     */
    close: () => void;

    /**
     * 添加事件监听函数
     */
    addEventListener: <Event extends keyof PolylineToolEventFactory>(event: Event, handler: PolylineToolEventFactory[Event]) => void;

    /**
     * 移除事件监听函数
     */
    removeEventListener: <Event extends keyof PolylineToolEventFactory>(event: Event, handler: PolylineToolEventFactory[Event]) => void
}
